home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / texte / 7up_pd / fsel_inp.c < prev    next >
C/C++ Source or Header  |  1998-10-29  |  8KB  |  282 lines

  1. /* ------------------------------------------------------------------------- */
  2. /* ----- fsel_inp.c ----- Ein universeller fsel_(ex)input() Call ----------- */
  3. /* ---------------------- und Routinen für den Selectric Support ----------- */
  4. /* ------------------------------------------------------------------------- */
  5. /* ----------------------------------------- (c) 1992 by Oliver Scheel ----- */
  6. /* ------------------------------------------------------------------------- */
  7. #include <portab.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <tos.h>
  12. #include <vdi.h>
  13.  
  14. #include "fsel_inp.h"
  15. /*
  16. #define NULL    ((void *) 0l);
  17. #define FALSE    0
  18. #define TRUE    (!FALSE)
  19. */
  20. /* ------------------------------------------------------------------------- */
  21.  
  22. SLCT_STR    *slct = NULL;
  23. long        *fsel = NULL;
  24.  
  25. SYSHDR        *sys_header;
  26.  
  27. /* ----- Cookie Jar -------------------------------------------------------- */
  28.  
  29. typedef struct
  30. {
  31.     long    id,
  32.         *ptr;
  33. } COOKJAR;
  34.  
  35. /* ------------------------------------------------------------------------- */
  36. /* ----- get_cookie -------------------------------------------------------- */
  37. /* ------------------------------------------------------------------------- */
  38.  
  39. long *get_cookie(long cookie)
  40. {
  41.     long    sav;
  42.     COOKJAR    *cookiejar;
  43.     int    i = 0;
  44.  
  45.     sav = Super((void *)1L);
  46.     if(sav == 0L)
  47.         sav = Super(0L);
  48.     cookiejar = *((COOKJAR **)0x05a0l);
  49.     sys_header = *((SYSHDR **)0x04f2L);    /* ... wenn wir schonmal
  50.                             super drauf sind */
  51.     if(sav != -1L)
  52.         Super((void *)sav);
  53.     if(cookiejar)
  54.     {
  55.         while(cookiejar[i].id)
  56.         {
  57.             if(cookiejar[i].id == cookie)
  58.                 return(cookiejar[i].ptr);
  59.             i++;
  60.         }
  61.     }
  62.     return(0l);
  63. }
  64.  
  65. /* ------------------------------------------------------------------------- */
  66. /* ----- fsel_check -------------------------------------------------------- */
  67. /* ------------------------------------------------------------------------- */
  68. /*
  69. **    int fsel_check(void)
  70. **
  71. **    Funktion:    Prüft nach, ob ein FSEL-Cookie vorhanden ist.
  72. **
  73. **    Parameter:    keine
  74. **
  75. **    Return:        TRUE    FSEL-Cookie vorhanden.
  76. **            FALSE    -----"----- nicht vorhanden.
  77. **
  78. ** ------------------------------------------------------------------------- */
  79.  
  80. int fsel_check(void)
  81. {
  82.     if(!fsel)
  83.         fsel = get_cookie('FSEL');
  84.     return(fsel ? TRUE : FALSE);
  85. }
  86.  
  87. /* ------------------------------------------------------------------------- */
  88. /* ----- slct_check -------------------------------------------------------- */
  89. /* ------------------------------------------------------------------------- */
  90. /*
  91. **    int slct_check(unsigned int version)
  92. **
  93. **    Funktion:    Checkt, ob Selectric installiert ist und ob es
  94. **            die Mindest-Versionsnummer besitzt.
  95. **
  96. **    Parameter:    version    Enhält die zu prüfende Versionsnummer
  97. **                (es wird ein '>='-Test gemacht!!)
  98. **
  99. **    Return:        TRUE    Selectric ist installiert und
  100. **                die Versionsnummer ist ok.
  101. **            FALSE    Entweder nicht installiert oder zu
  102. **                niedrige Versionsnummer.
  103. **
  104. ** ------------------------------------------------------------------------- */
  105.  
  106. int slct_check(unsigned int version)
  107. {
  108.     if(fsel_check())
  109.     {
  110.         slct = (SLCT_STR *)fsel;
  111.         if(slct->id != 'SLCT')
  112.             slct = 0L;
  113.     }
  114.     if(slct && (slct->version >= version))
  115.         return(TRUE);
  116.     else
  117.         return(FALSE);
  118. }
  119.  
  120. /***************************************************************************
  121. /* ------------------------------------------------------------------------- */
  122. /* ----- file_select ------------------------------------------------------- */
  123. /* ------------------------------------------------------------------------- */
  124. /*
  125. **    int file_select(char *pfname, char *pname, char *fname, char *ext,
  126. **            char *title)
  127. **
  128. **    Funktion:    Ruft den FileSelector in komfortabler Art und Weise
  129. **            auf. Dabei kann man alle Parts (Filename, Pathname,
  130. **            etc.) einzeln übergeben. Man kann aber auch Pathname
  131. **            und den kompletten Namen in `pfname' übergeben. Diese
  132. **            Routine sucht sich schon das, was ihr fehlt in
  133. **            bestimmten Grenzen selbst heraus.
  134. **            Diese Funktion unterstützt den FSEL-Cookie und läuft
  135. **            auch ohne Selectric.
  136. **
  137. **    Parameter:    *pfname    Enthält abschließend den fertigen Pfad, den
  138. **                man sofort in ein `open' einsetzen kann.
  139. **            *pname    Der Startpfad (ohne Wildcards!).
  140. **            *fname    Ein voreingestellte Filenamen.
  141. **            *ext    Eine Extension.
  142. **            *title    Einen Boxtitel. Dabei wird a) die TOS-Version
  143. **                als auch der FSEL-Cookie überprüft.
  144. **
  145. **    Return:        Der Button mit dem der Selector verlassen wurde.
  146. **
  147. **    Bemerkung:    Beim Aufruf aus Accessories nicht vergessen ein
  148. **            BEG/END_UPDATE um diesen Aufruf zu legen!!!!!!!!!!
  149. **            Die meisten File-Selector Clones (incl. Selectric)
  150. **            machen das eh, nicht aber das Original ...
  151. **
  152. ** ------------------------------------------------------------------------- */
  153.  
  154. int file_select(char *pfname, char *pname, char *fname, const char *ext, char *title)
  155. {
  156.     int    but;
  157.     char    *p;
  158.  
  159.     if(!fname[0])
  160.     {
  161.         p = strrchr(pfname, '\\');
  162.         if(!p)
  163.             p = strrchr(pfname, '/')
  164.         if(p)
  165.             strcpy(fname, p+1);
  166.         else
  167.             strcpy(fname, pfname);
  168.     }
  169.     if(!pname[0])
  170.     {
  171.         p = strrchr(pfname, '\\');
  172.         if(!p)
  173.             p = strrchr(pfname, '/')
  174.         if(p)
  175.         {
  176.             p[1] = '\0';
  177.             strcpy(pname, pfname);
  178.         }
  179.     }
  180.     else
  181.         complete_path(pname); /* '/' oder  '\' */
  182. /*
  183.     else if(pname[strlen(pname)-1] != '\\')
  184.         strcat(pname, "\\");
  185. */
  186.     strcat(pname, ext);
  187.  
  188.     if(fsel_check() || (sys_header->os_version >= 0x0104))
  189.         fsel_exinput(pname, fname, &but, title);
  190.     else
  191.         fsel_input(pname, fname, &but);
  192.  
  193.     p = strrchr(pname, '\\');
  194.     if(!p)
  195.         p = strrchr(pname, '/');
  196.     if(p)
  197.         *p = '\0';
  198.     strcpy(pfname, pname);
  199. /*
  200.     if(getenv("UNIXMODE")!=NULL)
  201.         strcat(pfname, "/");
  202.     else
  203. */
  204.         strcat(pfname, "\\");
  205.     strcat(pfname, fname);
  206.     return(but);
  207. }
  208.  
  209. /* ------------------------------------------------------------------------- */
  210. /* ----- slct_extpath ------------------------------------------------------ */
  211. /* ------------------------------------------------------------------------- */
  212. /*
  213. **    int slct_extpath(int ext_num, char *ext[], int path_num, char *paths[])
  214. **
  215. **    Funktion:    Setzt benutzerdefinierte Extensions und Pfade,
  216. **            welche dann von Selectric benutzt werden. Die
  217. **            Extensions und Pfade müssen vor jedem Selectric-
  218. **            Aufruf gesetzt werden!
  219. **
  220. **    Parameter:    ext_num        Anzahl der Extensions
  221. **            *ext[]        Die Extensions
  222. **            path_num    Anzahl Pfade
  223. **            *paths[]    Die Pfade
  224. **
  225. **    Return:        TRUE    Selectric ist installiert
  226. **            FALSE    Selectric ist nicht installiert
  227. **
  228. ** ------------------------------------------------------------------------- */
  229.  
  230. int slct_extpath(int ext_num, char *(*ext)[], int path_num, char *(*paths)[])
  231. {
  232.     if(slct_check(0x0100))
  233.     {
  234.         slct->num_ext = ext_num;
  235.         slct->ext = ext;
  236.         slct->num_paths = path_num;
  237.         slct->paths = paths;
  238.         return(TRUE);
  239.     }
  240.     else
  241.         return(FALSE);
  242. }
  243. ***************************************************************************/
  244.  
  245. /* ------------------------------------------------------------------------- */
  246. /* ----- slct_morenames ---------------------------------------------------- */
  247. /* ------------------------------------------------------------------------- */
  248. /*
  249. **    int slct_morenames(int mode, int num, void *ptr)
  250. **
  251. **    Funktion:    Initialisiert Selectric so, daß es weiß, daß mehr
  252. **            als ein Name zurückgegeben werden kann.
  253. **
  254. **    Parameter:    mode    Gibt den Modus an. Z.Zt sind folgende Modi
  255. **                vorhanden:
  256. **                0    Files in Pointerlist zurückgeben.
  257. **                1    Files in einem einzigen String -"-.
  258. **            num    Anzahl der Namen die maximal zu-
  259. **                rückgegeben werden sollen.
  260. **            *ptr    Der Zeiger auf die entsprechende
  261. **                Struktur.
  262. **
  263. **    Return:        TRUE    Selectric ist installiert
  264. **            FALSE    Selectric ist nicht installiert
  265. **
  266. ** ------------------------------------------------------------------------- */
  267.  
  268. int slct_morenames(int mode, int num, void *ptr)
  269. {
  270.     if(slct_check(0x0100))
  271.     {
  272.         slct->comm |= CMD_FILES_OUT;
  273.         if(mode)
  274.             slct->comm |= CFG_ONESTRING;
  275.         slct->out_count = num;
  276.         slct->out_ptr = ptr;
  277.         return(TRUE);
  278.     }
  279.     else
  280.         return(FALSE);
  281. }
  282.